﻿/*
题目: 字母异位词分组

给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

https://leetcode.cn/problems/group-anagrams/description/
*/

#include <iostream>
#include <random>
#include <string>
#include <vector>
#include <list>
#include "TreeNode.hpp"
#include "ListNode.hpp"
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <functional>

using namespace std;

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string, vector<string>> group;

        vector<vector<string>> res;
        for (const string& str : strs) {
            char letters[26] = { 0 };
            for (const char& ch : str) {
                letters[ch - 'a'] ++;
            }

            string key;
            for (int i = 0; i < 26; i++) {
                if (letters[i] > 0) {
                    key += to_string(letters[i]);
                    key.push_back(i + 'a');
                }
            }

            group[key].emplace_back(str);
        }

        for (const auto& kv : group) {
            res.emplace_back(std::move(kv.second));
        }

        return res;
    }
};

